iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Modern Web

Laravel 9 漫遊,享受魔法般的極速網頁開發體驗系列 第 13

Day 13:用 Factory 協助資料庫的自動化測試

  • 分享至 

  • xImage
  •  

針對資料庫的操作,大致介紹完了之後,下一步當然是針對資料庫的自動化測試囉!

在之前的 [Day 21] 和資料庫相關的測試!怎麼測試資料庫的存取 裡面,花費了一些篇幅,提到要怎麼在 laradock 環境下建立測試資料庫。

現在的 Laravel Sail 已經幫你建立好測試資料庫了!所以這段是不需要的。至於測試時改連到測試用資料庫這段,則是宣告在 phpunit.xml 裡面

<php>  
    <env name="APP_ENV" value="testing"/>  
    <env name="BCRYPT_ROUNDS" value="4"/>  
    <env name="CACHE_DRIVER" value="array"/>  
    <env name="DB_DATABASE" value="testing"/>  
    <env name="MAIL_MAILER" value="array"/>  
    <env name="QUEUE_CONNECTION" value="sync"/>  
    <env name="SESSION_DRIVER" value="array"/>  
    <env name="TELESCOPE_ENABLED" value="false"/>  
</php>

(這邊要特別注意!如果沒有好好宣告,或者被其他人註解掉的話,

可能會導致自動測試時使用本地的資料庫,導致本地資料錯誤或者遺失!)

測試的方式大同小異,可以參考之前的文章作法。

這邊補充一些之前沒有介紹到的功能,像是在每次執行自動化測試後,幫忙清理資料庫的 RefreshDatabase

<?php
 
namespace Tests\Feature;
 
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
    use RefreshDatabase;
}

新的 Laravel 還加上了一些新的斷言方式,可以讓測試更加語意化,比方說 assertDatabaseCount();

$this->assertDatabaseCount('users', 5);

和原本就有的 assertSoftDeleted 對應的 assertNotSoftDeleted()

$this->assertNotSoftDeleted($user);

Model Factory

Model Factory 也是對自動化測試很有幫助的一個功能,不過以前的文章礙於篇幅,沒有好好介紹這一段。今天來好好介紹一下。

簡單的說,就是在撰寫測試時,特別是針對資料相關的測試,我們常常會需要一些假資料。這時候,與其寫程式一個一個 Model 的建立,如果可以寫一個元件,像是工廠一樣,幫我們一次建立好很多個物件,那不是很方便嗎?

這個觀念,就是所謂的 Factory,使用方法如下:

$user = User::factory()->create();

$users = User::factory()->count(3)->create();

如果希望物件建立好,不要儲存到資料庫內,可以用 make()

$user = User::factory()->make();

$users = User::factory()->count(3)->make();

如果希望物件建立時指定某個屬性,可以在 create() 裡面加上參數

$user = User::factory()->create([
    'name' => 'Alice',
]);

那麼,要怎麼建立 Factory 呢?相信大家看了那麼多次,應該也越來越熟悉 Laravel 的習慣了:

./vendor/bin/sail artisan make:factory PostFactory

撰寫的方式,可以參考 Laravel 既有的 Database\Factories\UserFactory

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>
 */
class UserFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        return [
            'name' => fake()->name(),
            'email' => fake()->safeEmail(),
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }

    /**
     * Indicate that the model's email address should be unverified.
     *
     * @return static
     */
    public function unverified()
    {
        return $this->state(fn (array $attributes) => [
            'email_verified_at' => null,
        ]);
    }
}

各位可以看到,要寫出一個簡潔好用的 Factory,還有很多可以研究的地方呢!

今天我們就分享到這邊,各位明天見!


上一篇
Day 12:搭配 Soft Delete 的好夥伴:Pruning Models
下一篇
Day 14:另一種管理權限的方式:談 Laravel Gate
系列文
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言